package day0;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class code2 {

    public int lengthOfLongestSubstring(String s) {
        int len = s.length();
        HashMap<Character,Integer> map = new HashMap<>();

        int left = 0;
        int max = 0;

        for(int right=0;right<s.length();right++){
            char ch = s.charAt(right);
            if(map.getOrDefault(ch,0)<=0){
                max = Math.max(max,right-left+1);
                map.put(ch,1);
            }else {
               while (map.getOrDefault(ch,0)>0){
                   char tep = s.charAt(left);
                   map.put(tep,map.get(tep)-1);
                   left += 1;
               }
            }
        }

        return max;
    }
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList<>();

        if(p.length()>s.length()) return list;

        HashMap<Character,Integer> map1 = new HashMap<>();
        for (int i = 0; i < p.length(); i++) {
            map1.put(p.charAt(i),map1.getOrDefault(p.charAt(i),0)+1);
        }

        HashMap<Character,Integer> map2 = new HashMap<>();

        int len = p.length();
        for (int i = 0; i < len-1; i++) {
            map2.put(s.charAt(i),map2.getOrDefault(s.charAt(i),0)+1);
        }

        for (int i = len-1; i < s.length(); i++) {
            map2.put(s.charAt(i),map2.getOrDefault(s.charAt(i),0)+1);
            if(fun(map1,map2)){
                list.add(i-len+1);
            }
            map2.put(s.charAt(i-len+1),map2.getOrDefault(s.charAt(i-len+1),0)-1);

        }

        return list;


    }

    public boolean fun(HashMap<Character,Integer> map1,HashMap<Character,Integer> map2){
        for(Character ch: map1.keySet()){
            if(!map2.containsKey(ch)) return false;
            if(!map2.get(ch).equals(map1.get(ch))) return false;
        }
        return true;
    }



}
